export default class AxiosCanceler {
  #pendingMap = new Map();
  #getPendingUrl(config) {
    return [config.method, config.url, config.params, config.data].join('&');
  }
  /**
  * 添加请求
  * @param config 请求配置
  */
  addPending(config) {
    this.removePending(config);
    const url = this.#getPendingUrl(config);
    const controller = new AbortController()
    config.signal = config.signal || controller.signal;
    if (!this.#pendingMap.has(url)) {
      // 如果 pendingMap 中不存在当前请求，则添加进去
      this.#pendingMap.set(url, controller);
    }
  }
  /**
  * 移除请求
  * @param config 请求配置
  */
  removePending(config) {
    const url = this.#getPendingUrl(config);
    if (this.#pendingMap.has(url)) {
      // 如果 pendingMap 中存在当前请求，则取消当前请求并删除
      const controller = this.#pendingMap.get(url);
      controller?.abort();
      this.#pendingMap.delete(url);
    }
  }
  /**
  * 清除所有等待中的请求
  */
  removeAllPending() {
    for (const [, controller] of this.#pendingMap) {
      controller?.abort();
    }
    this.#pendingMap.clear();
  }
}